package com.lanvideo.service;

import com.lanvideo.dao.VideoDao;
import com.lanvideo.entity.Video;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;

/**
 * 视频服务层
 */
@Service
public class VideoService {

    @Autowired
    private VideoDao videoDao;

    @Value("${video.upload-path:D:/lan-video/}")
    private String uploadPath;

    /**
     * 上传视频
     */
    public boolean uploadVideo(MultipartFile file, String title, String intro, String tags, Integer uploaderId) {
        try {
            // 检查上传目录是否存在
            File uploadDir = new File(uploadPath);
            if (!uploadDir.exists()) {
                boolean created = uploadDir.mkdirs();
                if (!created) {
                    return false;
                }
            }

            // 生成唯一文件名
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null || !originalFilename.contains(".")) {
                throw new IllegalArgumentException("文件名格式不正确");
            }
            
            String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
            String filename = UUID.randomUUID().toString() + extension;
            
            // 保存文件
            File targetFile = new File(uploadDir, filename);
            file.transferTo(targetFile);
            
            // 验证文件是否成功保存
            if (!targetFile.exists() || targetFile.length() == 0) {
                return false;
            }
            

            // 保存视频信息到数据库
            Video video = new Video();
            video.setTitle(title);
            video.setIntro(intro);
            video.setTags(tags);
            video.setPath(filename); // 只保存文件名，通过静态资源映射访问
            video.setUploaderId(uploaderId);
            video.setUploadTime(LocalDateTime.now());
            video.setStatus(0); // 默认状态为待审核

            return videoDao.save(video) > 0;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 获取所有已审核通过的视频（学生可见）
     */
    public List<Video> getAllVideos() {
        return videoDao.findApprovedVideos();
    }

    /**
     * 获取所有视频（管理员使用，包括所有状态）
     */
    public List<Video> getAllVideosForAdmin() {
        return videoDao.findAll();
    }

    /**
     * 获取已审核通过的视频
     */
    public List<Video> getApprovedVideos() {
        return videoDao.findApprovedVideos();
    }

    /**
     * 根据ID获取视频
     */
    public Video getVideoById(Integer id) {
        return videoDao.findById(id);
    }

    /**
     * 根据上传者ID获取视频列表（老师查看自己的视频，包括待审核）
     */
    public List<Video> getVideosByUploaderId(Integer uploaderId) {
        return videoDao.findByUploaderId(uploaderId);
    }

    /**
     * 搜索视频（学生搜索时只返回已审核通过的视频）
     */
    public List<Video> searchVideos(String keyword) {
        return videoDao.searchApprovedVideos(keyword);
    }

    /**
     * 高级搜索视频（学生使用）
     */
    public List<Video> advancedSearchVideos(String title, String uploader, String tags, String intro) {
        return videoDao.advancedSearchApprovedVideos(title, uploader, tags, intro);
    }

    /**
     * 高级搜索视频（管理员和老师使用）
     */
    public List<Video> advancedSearchAllVideos(String title, String uploader, String tags, String intro, Integer status) {
        return videoDao.advancedSearch(title, uploader, tags, intro, status);
    }

    /**
     * 删除视频
     */
    public boolean deleteVideo(Integer id) {
        Video video = videoDao.findById(id);
        if (video != null) {
            // 删除文件
            File uploadDir = new File(uploadPath);
            File file = new File(uploadDir, video.getPath());
            if (file.exists()) {
                boolean deleted = file.delete();
            }
            // 删除数据库记录
            return videoDao.deleteById(id) > 0;
        }
        return false;
    }

    /**
     * 更新视频信息
     */
    public boolean updateVideo(Video video) {
        if (video.getId() == null) {
            // 如果没有ID，说明是新视频，需要先保存
            return videoDao.save(video) > 0;
        } else {
            // 如果有ID，说明是更新现有视频
            return videoDao.update(video) > 0;
        }
    }

    /**
     * 获取视频总数
     */
    public int getVideoCount() {
        return videoDao.getTotalCount();
    }

    /**
     * 获取待审核视频列表
     */
    public List<Video> getPendingVideos() {
        return videoDao.findPendingVideos();
    }

    /**
     * 审核通过视频
     */
    public boolean approveVideo(Integer videoId) {
        return videoDao.approveVideo(videoId) > 0;
    }

    /**
     * 审核拒绝视频
     */
    public boolean rejectVideo(Integer videoId, String reason) {
        return videoDao.rejectVideo(videoId, reason) > 0;
    }
}
